﻿#pragma once
#ifndef Buffer_hpp
#define Buffer_hpp

#include<cstdint>
#include<atomic>
#include<iostream>
#include<fstream>
#include<filesystem>
#include<thread>
#include"../Concurrency/SpinLock.hpp"


namespace MMFLogger{

    class Buffer
    {
        std::atomic<uint32_t> mWriteSize;           ///< 写位置
        uint32_t mCapacity;                         ///< 容量
        char* mMem;                                 ///< 内存缓冲
        char* mAssistMem;                           ///< 辅助内存，用于写入数据
        const size_t mFileInterval;                 ///< 文件交换的时间间隔(微妙)   
        std::ofstream mFile;                        ///< 写入的文件句柄
        std::atomic<uint32_t> mReadSize;            ///< 读位置
        std::thread* mWorker;                       ///< 工作线程
        std::thread* mTimer;                        ///< 10毫秒一个的定时器， 用于定时创建文件
        size_t mLastTime;                           ///< 上一次的文件创建时间(微妙) 
        std::atomic<bool> mIsQuit;                  ///< 是否推出
        MMF::SpinLock mMutex;                       ///< 自旋锁

    public:

        //构造函数
        Buffer(uint32_t capacity, size_t interval);

        //析构函数
        ~Buffer();

        //外部写入数据
        uint32_t Write(const char* mem, uint32_t size);

        //判断此块缓存是否已经写满
        bool IsFull();

    private:

        //重制数据
        void Reset();

        //创建文件
        void CreateFile();

        //创建工作线程
        void CreateWorker();
    };
}


#endif